package com.sawgdev.android.bokuiki.activity;

import java.lang.reflect.Field;
import java.util.Calendar;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.sawgdev.android.bokuiki.R;
import com.sawgdev.android.bokuiki.bean.BeanConfig;
import com.sawgdev.android.bokuiki.common.Constants.EnumDateFormat;
import com.sawgdev.android.bokuiki.common.Util;
import com.sawgdev.android.bokuiki.common.database.BKDBHelper;
import com.sawgdev.android.bokuiki.common.database.BkpfDao;

/**
 * ボクダレダ（基本設定）画面のActivityです。
 *
 * @author y-yamaguchi
 */
public class ActSetting extends Activity implements View.OnClickListener {

	/** 名前（漢字） */
	private EditText edtName;

	/** 名前（フリガナ） */
	private EditText edtNameKana;

	/** 生年月日 */
	private DatePicker dtpBirth;

	/** 性別 */
	private RadioGroup rdgSex;

	/** 男性ラジオボタン */
	private RadioButton rdoMale;

	/** 女性ラジオボタン */
	private RadioButton rdoFemale;

	/** 電話番号 */
	private EditText edtTel;

	/** メールアドレス */
	private EditText edtEmail;

	/** 備考 */
	private EditText edtEtc;

	/** 住所 */
	private TextView txvAddress;

	/** 住所をMapから選択した時の緯度 */
	private double lat;
	/** 住所をMapから選択した時の経度 */
	private double lng;

	/** アラート通知方法 */
	private Spinner spnAlertNotification;

	/** 地図から選択ボタン */
	private Button btnSelectMap;

	/** メール設定 */
	private Button btnMailSetting;

	/** 戻るボタン */
	private Button btnBack;

	/** 確定ボタン */
	private Button btnCommit;

	/** GPS取得間隔の設定値 */
	// private Map<String, Integer> mapGpsInterval;

	/** アラート通知方法の設定値 */
	private Map<String, Integer> mapAlertNotification;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.setting);

		// +*+*+*+* 画面のコントロール参照値を取得 +*+*+*+*
		edtName = (EditText) findViewById(R.id.edt_name);
		edtNameKana = (EditText) findViewById(R.id.edt_name_kana);
		dtpBirth = (DatePicker) findViewById(R.id.dtp_birth);
		rdgSex = (RadioGroup) findViewById(R.id.rdg_sex);
		rdoMale = (RadioButton) findViewById(R.id.rdo_male);
		rdoFemale = (RadioButton) findViewById(R.id.rdo_female);
		edtTel = (EditText) findViewById(R.id.edt_tel);
		edtEmail = (EditText) findViewById(R.id.edt_email);
		edtEtc = (EditText) findViewById(R.id.edt_etc);
		txvAddress = (TextView) findViewById(R.id.txv_address);
		spnAlertNotification = (Spinner) findViewById(R.id.spn_alert_notification);
		btnSelectMap = (Button) findViewById(R.id.btn_select_map);
		btnMailSetting = (Button) findViewById(R.id.btn_mail_setting);
		btnBack = (Button) findViewById(R.id.btn_back);
		btnCommit = (Button) findViewById(R.id.btn_commit);

		// +*+*+*+* コントロールにイベント登録 +*+*+*+*
		btnBack.setOnClickListener(this);
		btnMailSetting.setOnClickListener(this);
		btnCommit.setOnClickListener(this);
		btnSelectMap.setOnClickListener(this);

		// +*+*+*+* 画面表示設定 +*+*+*+*
		setDispInfo();
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (requestCode == 0 && resultCode == Activity.RESULT_OK) {
			txvAddress.setText(data.getStringExtra("ADDRESS"));
			lat = data.getDoubleExtra("LATITUDE", 0.0);
			lng = data.getDoubleExtra("LONGTITUDE", 0.0);
		}
	}

	@Override
	public void onClick(View v) {
		int btnId = v.getId();

		switch (btnId) {
		// 地図から選択ボタン押下時の処理
		case R.id.btn_select_map:
			actionBtnSelectMapClick();
			break;

		// メール設定ボタン押下時の処理
		case R.id.btn_mail_setting:
			actionBtnMailSettingClick();
			break;

		// 戻るボタン押下時の処理
		case R.id.btn_back:
			actionBtnBackClick();
			break;

		// 確定ボタン押下時の処理
		case R.id.btn_commit:
			actionBtnCommitClick();
			break;

		default:
			throw new IllegalArgumentException();
		}

	}

	/**
	 * 画面表示設定をします。
	 */
	private void setDispInfo() {
		// +*+*+*+* コントロールの初期設定 +*+*+*+*

		// アラート通知方法（0:アラートなし 1:メール）
		mapAlertNotification = new LinkedHashMap<String, Integer>();
		mapAlertNotification.put("指定なし", 0);
		mapAlertNotification.put("メール", 1);
		setSpinner(spnAlertNotification, mapAlertNotification.keySet());

		// +*+*+*+* 設定値の復元 +*+*+*+*
		BkpfDao dao = new BkpfDao(BKDBHelper.getInstance(this)
				.getReadableDatabase());
		BeanConfig config = dao.selConfig();

		edtName.setText(config.getName());
		edtNameKana.setText(config.getNameKana());

		Calendar calBirth = Util.strToCalendar(config.getBirth(),
				EnumDateFormat.FORMAT_SIMPLE);
		dtpBirth.init(calBirth.get(Calendar.YEAR),
				calBirth.get(Calendar.MONTH),
				calBirth.get(Calendar.DAY_OF_MONTH), null);

		if (config.getSex() == 1) {
			rdoMale.setChecked(true);
			rdoFemale.setChecked(false);
		} else {
			rdoMale.setChecked(false);
			rdoFemale.setChecked(true);
		}

		edtTel.setText(config.getTel());
		edtEmail.setText(config.getEmail());
		edtEtc.setText(config.getEtc());
		txvAddress.setText(config.getAddress());
		spnAlertNotification.setSelection(config.getAlertNotification());
	}

	/**
	 * スピナー（コンボボックス）に選択項目を設定します。
	 *
	 * @param target
	 *            スピナー
	 * @param keySet
	 *            選択項目
	 */
	private void setSpinner(Spinner target, Set<String> keySet) {
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
				android.R.layout.simple_spinner_item);
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		// アイテムを追加します
		for (String str : keySet) {
			adapter.add(str);
		}
		// アダプターを設定します
		target.setAdapter(adapter);
	}

	/**
	 * ボクダレダ画面上の設定情報を取得します。
	 *
	 * @return BeanConfig ボクダレダ設定情報
	 */
	private BeanConfig getDispInfo() {
		BeanConfig result = new BeanConfig();
		result.setName(edtName.getText().toString());
		result.setNameKana(edtNameKana.getText().toString());
		Calendar cal = Calendar.getInstance();
		cal.set(dtpBirth.getYear(), dtpBirth.getMonth(),
				dtpBirth.getDayOfMonth());
		result.setBirth(Util.calendarToStr(cal, EnumDateFormat.FORMAT_SIMPLE));

		int sex = rdgSex.getCheckedRadioButtonId() == R.id.rdo_male ? 1 : 2;
		result.setSex(sex);
		result.setTel(edtTel.getText().toString());
		result.setEmail(edtEmail.getText().toString());
		result.setEtc(edtEtc.getText().toString());

		result.setAddress(txvAddress.getText().toString());
		result.setLat(lat);
		result.setLng(lng);
		result.setAlertNotification(mapAlertNotification
				.get(spnAlertNotification.getSelectedItem()));

		return result;
	}

	/**
	 * <pre>
	 * 地図から選択ボタン押下時に実行される処理です。
	 * GoogleMapを表示し、住所を検索します。
	 * </pre>
	 */
	private void actionBtnSelectMapClick() {
		Intent intent = new Intent(ActSetting.this, ActKokoikiMap.class);
		startActivityForResult(intent, 0);
	}

	/**
	 * <pre>
	 * メール設定ボタン押下時に実行される処理です。
	 * メール設定画面に遷移します。
	 * </pre>
	 */
	private void actionBtnMailSettingClick() {
		Intent intent = new Intent(ActSetting.this, ActMailSetting.class);
		startActivity(intent);
	}

	/**
	 * <pre>
	 * 確定ボタン押下時に実行される処理です。
	 * 入力された情報をチェックし、エラーが無い場合はDBにデータを登録します。
	 * </pre>
	 */
	private void actionBtnCommitClick() {
		try {
			// エラーチェック
			if (!validate()) {
				return;
			}
			BeanConfig bean = getDispInfo();
			BkpfDao dao = new BkpfDao(BKDBHelper.getInstance(this)
					.getWritableDatabase());
			dao.mrgConfig(bean);
			Toast.makeText(this, "設定が完了しました。", Toast.LENGTH_LONG).show();
			this.finish();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}

	/**
	 * <pre>
	 * 戻るボタン押下時に実行される処理です。
	 * この画面を閉じます。
	 * </pre>
	 */
	private void actionBtnBackClick() {
		finish();
	}

	/**
	 * <pre>
	 * 入力チェックをします。
	 * </pre>
	 *
	 * @return true:OK false:NG
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 */
	private boolean validate() throws IllegalArgumentException,
			IllegalAccessException {
		boolean result = true;

		// EditTextのエラー表示を初期化
		for (Field field : this.getClass().getDeclaredFields()) {
			if (StringUtils.startsWith(field.getName(), "edt")) {
				field.setAccessible(true);
				EditText edt = (EditText) field.get(this);
				edt.setError(null);
			}
		}

		// 名前（漢字）チェック
		if (!StringUtils.isNotEmpty(edtName.getText().toString())) {
			result = false;
			edtName.setError("名前を入力して下さい");
		}

		// 名前（フリガナ）チェック
		if (!StringUtils.isNotEmpty(edtNameKana.getText().toString())) {
			result = false;
			edtNameKana.setError("フリガナを入力して下さい");
		}

		// 電話番号チェック
		if (!StringUtils.isNotEmpty(edtTel.getText().toString())) {
			result = false;
			edtTel.setError("電話番号を入力して下さい");
		}

		// メールアドレスチェック
		if (!StringUtils.isNotEmpty(edtEmail.getText().toString())) {
			result = false;
			edtEmail.setError("メールアドレスを入力して下さい");
		}

		// 住所チェック
		if (!StringUtils.isNotEmpty(txvAddress.getText().toString())) {
			result = false;
			txvAddress.setError("住所を設定して下さい");
		}

		return result;
	}
};
